package com.pfzy.rxbus2demo

import com.blankj.rxbus.RxBus

/**
 * 如果用到事件总线的地方比较多，那么可以把事件总线的使用放到一个 Manager 中使用
 *
 * 1、利用 FlowableProcessor 既可以作为观察者又可以作为被观察者来实现事件总线
 * 2、粘性事件原理就是发送的时候把事件存到一个 hash 表中，在注册的时候查询下 hash 表中是否存在符合的事件，有的话就消费掉即可
 * 3、替换原有 LambdaSubscriber 来让抛了异常之后可以继续接收到后续事件
 * 4、封装了 TagMessage 来区分不同类别的 tag
 * 5、动态识别范型对象来省去传入 Type 类型
 */
object RxBusManager {
    private const val MY_TAG = "MY_TAG"

    /**
     * 订阅RxBus管理器活动
     */
    fun subscribeRxBusManagerActivity(activity: RxBusManagerActivity) {
        RxBus.getDefault().subscribe(activity, object : RxBus.Callback<String>() {
            override fun onEvent(s: String) {
                activity.updateText("without $s")
            }
        })
        RxBus.getDefault().subscribe(activity, MY_TAG, object : RxBus.Callback<String>() {
            override fun onEvent(s: String) {
                activity.updateText("with $s")
            }
        })
    }

    /**
     * 发布到RxBus管理活动
     */
    fun postToRxBusManagerActivity(event: String?) {
        RxBus.getDefault().post(event)
    }

    /**
     * 发送 有 我的标签 到  RxBus管理活动
     */
    fun postWithMyTagToRxBusManagerActivity(event: String?) {
        RxBus.getDefault().post(event, MY_TAG)
    }

    /**
     * 发送 粘性 到 RxBus管理活动
     */
    fun postStickyToRxBusManagerActivity(event: String?) {
        RxBus.getDefault().postSticky(event)
    }

    /**
     * 发送 粘性 有 我的标签 到 RxBus管理活动
     */
    fun postStickyWithMyTagToRxBusManagerActivity(event: String?) {
        RxBus.getDefault().postSticky(event, MY_TAG)
    }

    /**
     * 注销RxBus管理器活动
     */
    fun unregisterRxBusManagerActivity(activity: RxBusManagerActivity?) {
        RxBus.getDefault().unregister(activity)
    }
}
